package com.engine.budget.manager;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import weaver.conn.RecordSet;
import weaver.integration.logging.Logger;
import weaver.integration.logging.LoggerFactory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

public class InstructionChangeManager {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public void YSZXChange(String ysxmbm){

        HashMap<String, Object> res = new HashMap<>();
        //1.查询执行表

        ArrayList<JSONObject> list = getDzyslx(ysxmbm);
        //2.更新执行表
        //预算执行底表：
        //    可用预算总额=年度预算+调整预算_年中+调整预算_零星；
        //    发生总额=占用预算+执行预算；
        //    预算余额=可用预算总额-发生总额；
        for (JSONObject jsonObject : list) {
            //    可用预算总额=年度预算+调整预算_年中+调整预算_零星；
            BigDecimal ndys = jsonObject.getBigDecimal("ndys");
            BigDecimal dzysnz = jsonObject.getBigDecimal("dzysnz");
            BigDecimal dzyslx = jsonObject.getBigDecimal("dzyslx");
            //可用预算总额
            BigDecimal kyysze = ndys.add(dzysnz).add(dzyslx);
            //    发生总额=占用预算+执行预算；
            BigDecimal zyys = jsonObject.getBigDecimal("zyys");
            BigDecimal zhys = jsonObject.getBigDecimal("zhys");
            //发生总额
            BigDecimal fsze = zyys.add(zhys);

            //    预算余额=可用预算总额-发生总额；
            BigDecimal ysye = kyysze.subtract(fsze);

            ArrayList<Object> list3 = new ArrayList<>();
            list3.add(kyysze);
            list3.add(fsze);
            list3.add(ysye);
            list3.add(jsonObject.getString("id"));
            //向【预算执行底表】推数，更新“【项目.年度预算-调整额】+【调整预算-零星】→【调整预算-零星】”
            String sql3 = "update uf_yszxdb set kyysze=?,fsze=?,ysye=? where id=?";
            RecordSet rs3 = new RecordSet();
            boolean b=rs3.executeUpdate(sql3, list3);
            logger.info("向【预算执行底表】推数，更新“【项目.年度预算-调整额】+【调整预算-零星】→【调整预算-零星】,flage:"+b+"");
            if (!b){
                res.put("isOk",b);
                res.put("msg","更新失败");
                logger.info("更新失败,list:"+list3.toString());
            }
        }

    }

    public void YSXMChange(String ysxmbm){
        JSONObject ysxmdb = selectUfYSXMDBByProjectNumber(ysxmbm);
        //1.查询项目年度明细表
        ArrayList<JSONObject> numberList = selectUfYSXMDBByProjectNumberList(ysxmdb.getString("id"));
        //2.更新项目年度明细表
        // 年度预算明细：
        //    年度预算=年度期初预算+年度调整预算_年中+年度调整预算_零星；
        //    发生总额=执行数+占用数；
        //    预算余额=年度预算-发生总额；
        for (JSONObject jsonObject : numberList) {
            //    年度预算=年度期初预算+年度调整预算_年中+年度调整预算_零星；
            BigDecimal ndqcys = jsonObject.getBigDecimal("ndqcys");
            BigDecimal ndqcysnz = jsonObject.getBigDecimal("ndqcysnz");
            BigDecimal ndqcyslx = jsonObject.getBigDecimal("ndqcyslx");
            //    年度预算
            BigDecimal ndys = ndqcys.add(ndqcysnz).add(ndqcyslx);

            //    发生总额=执行数+占用数；
            BigDecimal zhs = jsonObject.getBigDecimal("zhs");
            BigDecimal zys = jsonObject.getBigDecimal("zys");
            //发生总额
            BigDecimal fsze = zhs.add(zys);

            //    预算余额=年度预算-发生总额；
            BigDecimal ysye = ndys.subtract(fsze);

            ArrayList<Object> list2 = new ArrayList<>();
            list2.add(ndys);
            list2.add(fsze);
            list2.add(ysye);
            list2.add(jsonObject.getString("id"));
            //向【项目底表年度明细表】推数，更新“【项目.年度预算-调整额】+年度调整预算→年度调整预算”
            String sql2 = "update uf_ysxmdb_dt1 set ndys=?,fsze=?,ysye=? where id = ?";
            RecordSet rs2 = new RecordSet();
            boolean b = rs2.executeUpdate(sql2, list2);
            if (!b){
                logger.info("YSXMChange-uf_ysxmdb_dt1-更新年度预算明细失败,list:"+list2.toString());
              //  return res;
            }
        }
        ArrayList<JSONObject> list = selectUfYSXMDBByProjectNumber2(ysxmdb.getString("id"));
        //4.更新项目全周期明细表
        //    全周期预算明细：
        //    全周期项目总额=全周期期初总额+全周期调整额度；
        //    全周期累计已执行金额=执行数+占用数；
        //    全周期剩余可执行金额=全周期项目总额-全周期累计已执行金额；
        for (JSONObject jsonObject : list) {
            //    全周期项目总额=全周期期初总额+全周期调整额度；
            BigDecimal qzqqcze = jsonObject.getBigDecimal("qzqqcze");
            BigDecimal qzqdzed = jsonObject.getBigDecimal("qzqdzed");
            //全周期项目总额
            BigDecimal qzqxmze = qzqqcze.add(qzqdzed);

            //    全周期累计已执行金额=执行数+占用数；
            BigDecimal zhs = jsonObject.getBigDecimal("zhs");
            BigDecimal zys = jsonObject.getBigDecimal("zys");
            //全周期累计已执行金额
            BigDecimal qzqljyzhje = zys.add(zhs);

            //    全周期剩余可执行金额=全周期项目总额-全周期累计已执行金额；
            BigDecimal qzqsykzhje = qzqxmze.subtract(qzqljyzhje);

            ArrayList<Object> list2 = new ArrayList<>();
            list2.add(qzqxmze);
            list2.add(qzqljyzhje);
            list2.add(qzqsykzhje);
            list2.add(jsonObject.getString("id"));
            //向【项目底表年度明细表】推数，更新“【项目.年度预算-调整额】+年度调整预算→年度调整预算”
            String sql2 = "update uf_ysxmdb_dt2 set qzqxmze=?,qzqljyzhje=?,qzqsykzhje=? where id = ?";
            RecordSet rs2 = new RecordSet();
            boolean b = rs2.executeUpdate(sql2, list2);
            if (!b){
             logger.info("更新年度预算明细失败,list:"+list2.toString());
            }
        }

    }


    public void YSSXChange(String yssxbm){



        //1.查询事项是否存在
        JSONObject transactionBYId = getTransactionBYId(yssxbm);
        if (transactionBYId == null){
         logger.info("YSSXChange事项编码错误");
        }

        //2.查询事项年度预算表
        ArrayList<JSONObject> arrayList = getTransactionDt1(transactionBYId.getString("id"));
        //3.重新计算事项年度预算表
        //预算事项底表：
        //    年度预算明细：
        //    年度预算=年度期初预算+年度调整预算_年中+年度调整预算_零星；
        //    年度剩余可分配预算=年度预算-年度已分配项目预算；
        //    发生总额=执行数+占用数；
        //    预算余额=年度预算-发生总额；
        for (JSONObject jsonObject : arrayList) {
            //年度预算=年度期初预算+年度调整预算_年中+年度调整预算_零星；
            BigDecimal ndqcys = jsonObject.getBigDecimal("ndqcys");
            BigDecimal nddzysnz = jsonObject.getBigDecimal("nddzysnz");
            BigDecimal nddzyslx = jsonObject.getBigDecimal("nddzyslx");
            //年度预算
            BigDecimal ndys = ndqcys.add(nddzysnz).add(nddzyslx);

            //年度剩余可分配预算=年度预算-年度已分配项目预算；
            //年度已分配项目预算
            BigDecimal ndyfpxmys = jsonObject.getBigDecimal("ndyfpxmys");
            //年度剩余可分配预算
            BigDecimal ndsykfpys = ndys.subtract(ndyfpxmys);

            //    发生总额=执行数+占用数；
            BigDecimal zhs = jsonObject.getBigDecimal("zhs");
            BigDecimal zys = jsonObject.getBigDecimal("zys");
            //发生总额
            BigDecimal fsze = zhs.add(zys);

            //   预算余额=年度预算-发生总额；
            BigDecimal ysye = ndys.subtract(fsze);

            ArrayList<Object> list = new ArrayList<>();
            list.add(ndys);
            list.add(ndsykfpys);
            list.add(fsze);
            list.add(ysye);
            list.add(jsonObject.getString("id"));
            String sql = "update uf_yssxdb_dt1 set ndys=?,ndsykfpys=?,fsze=?,ysye=? where id = ?";
            RecordSet rs = new RecordSet();
            boolean b = rs.executeUpdate(sql, list);
            if (!b){
                logger.info("YSSXChange-uf_yssxdb_dt1-更新失败,list:"+list.toString());
            }
        }
        ArrayList<JSONObject> qzqlist = getTransactionDt2(transactionBYId.getString("id"));
        //5.重新计算事项全周期明细表
        //    全周期预算明细：
        //    全周期事项总额=全周期期初总额+全周期调整额度；
        //    全周期剩余可立项金额=全周期事项总额-全周期已立项金额；
        //    全周期累计已执行金额=执行数+占用数；
        //    全周期剩余可执行金额=全周期事项总额-全周期累计已执行金额；
        for (JSONObject jsonObject : qzqlist) {

            //全周期事项总额=全周期期初总额+全周期调整额度；
            BigDecimal qzqqcze = jsonObject.getBigDecimal("qzqqcze");
            BigDecimal qzqdzed = jsonObject.getBigDecimal("qzqdzed");
            //全周期事项总额
            BigDecimal qzqsxze = qzqqcze.add(qzqdzed);

            //    全周期剩余可立项金额=全周期事项总额-全周期已立项金额；
            BigDecimal qzqylxje = jsonObject.getBigDecimal("qzqylxje");
            //全周期剩余可立项金额
            BigDecimal qzqsyklxje = qzqsxze.subtract(qzqylxje);

            //    全周期累计已执行金额=执行数+占用数；
            BigDecimal zhs = jsonObject.getBigDecimal("zhs");
            BigDecimal zys = jsonObject.getBigDecimal("zys");
            //全周期累计已执行金额
            BigDecimal qzqljyzhje = zhs.add(zys);

            //    全周期剩余可执行金额=全周期事项总额-全周期累计已执行金额；
            BigDecimal qzqsykzhje = qzqsxze.subtract(qzqljyzhje);

            ArrayList<Object> list = new ArrayList<>();
            list.add(qzqsxze);
            list.add(qzqsyklxje);
            list.add(qzqljyzhje);
            list.add(qzqsykzhje);
            list.add(jsonObject.getString("id"));
            String sql = "update uf_yssxdb_dt2 set qzqsxze=?,qzqsyklxje=?,qzqljyzhje=?,qzqsykzhje=? where id = ?";
            RecordSet rs = new RecordSet();
            boolean b = rs.executeUpdate(sql, list);
            if (!b){
                logger.info("YSSXChange-uf_yssxdb_dt2-更新失败,list:"+list.toString());
            }
        }


    }

    /**
     * 查询项目底表年度明细表
     * @return
     */
    public ArrayList<JSONObject> selectUfYSXMDBByProjectNumberList(String mainid){
        String sql = "select * from uf_ysxmdb_dt1 where mainid = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, mainid);
        ArrayList<JSONObject> list = new ArrayList<>();
        while (rs.next()){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("dwjzdgz",rs.getString("dwjzdgz"));
            jsonObject.put("ysnd",rs.getString("ysnd"));
            jsonObject.put("yskm",rs.getString("yskm"));
            jsonObject.put("ndqcys",rs.getString("ndqcys"));
            jsonObject.put("ndqcysnz",rs.getString("ndqcysnz"));
            jsonObject.put("ndqcyslx",rs.getString("ndqcyslx"));
            jsonObject.put("ndys",rs.getString("ndys"));
            jsonObject.put("zhs",rs.getString("zhs"));
            jsonObject.put("zys",rs.getString("zys"));
            jsonObject.put("fsze",rs.getString("fsze"));
            jsonObject.put("ysye",rs.getString("ysye"));
            list.add(jsonObject);
        }
        return list;
    }


    /**
     * 查询项目底表
     * @param projectNumber
     * @return
     */
    public JSONObject selectUfYSXMDBByProjectNumber(String projectNumber){
        String sql = "select * from uf_ysxmdb where xmbm = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, projectNumber);
        JSONObject jsonObject = new JSONObject();
        while (rs.next()){
            jsonObject.put("zhdw",rs.getString("zhdw"));
            jsonObject.put("id",rs.getString("id"));
            jsonObject.put("xmbm",rs.getString("xmbm"));
            jsonObject.put("xmmc",rs.getString("xmmc"));
            jsonObject.put("ywlx",rs.getString("ywlx"));
            jsonObject.put("ywxl",rs.getString("ywxl"));
            jsonObject.put("zz",rs.getString("zz"));
            jsonObject.put("hdnf",rs.getString("hdnf"));
            jsonObject.put("sfgb",rs.getString("sfgb"));
            jsonObject.put("qbmc",rs.getString("qbmc"));
            jsonObject.put("qbzje",rs.getString("qbzje"));
            jsonObject.put("xmzbrgh",rs.getString("xmzbrgh"));
            jsonObject.put("xmzbrmc",rs.getString("xmzbrmc"));
            jsonObject.put("xmqdsj",rs.getString("xmqdsj"));
            jsonObject.put("xmjssj",rs.getString("xmjssj"));
            jsonObject.put("szjyjhzd",rs.getString("szjyjhzd"));
            jsonObject.put("ywxmbm",rs.getString("ywxmbm"));
            jsonObject.put("ywxmmc",rs.getString("ywxmmc"));
            jsonObject.put("ywxmid",rs.getString("ywxmid"));
            jsonObject.put("xmmblx",rs.getString("xmmblx"));
            jsonObject.put("szywcp",rs.getString("szywcp"));
            jsonObject.put("modedatamodifier",rs.getString("modedatamodifier"));
            jsonObject.put("modedatamodifydatetime",rs.getString("modedatamodifydatetime"));
            jsonObject.put("yssx",rs.getString("yssx"));

        }
        return jsonObject;
    }

    /**
     * 查询项目底表全周期明细表
     * @return
     */
    public  ArrayList<JSONObject> selectUfYSXMDBByProjectNumber2(String mainid){
        String sql = "select * from uf_ysxmdb_dt2 where  mainid = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, mainid);
        ArrayList<JSONObject> list = new ArrayList<>();
        while (rs.next()){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("yskm",rs.getString("yskm"));
            jsonObject.put("qzqqcze", StringUtils.isEmpty(rs.getString("qzqqcze")) ? "0" :rs.getString("qzqqcze"));
            jsonObject.put("qzqdzed",StringUtils.isEmpty(rs.getString("qzqdzed")) ? "0" :rs.getString("qzqdzed"));
            jsonObject.put("zhs",rs.getString("zhs"));
            jsonObject.put("zys",rs.getString("zys"));
            jsonObject.put("qzqljyzhje",StringUtils.isEmpty(rs.getString("qzqljyzhje")) ? "0":rs.getString("qzqljyzhje"));
            jsonObject.put("qzqsykzhje",StringUtils.isEmpty(rs.getString("qzqsykzhje"))?"0":rs.getString("qzqsykzhje"));
            jsonObject.put("qzqxmze",StringUtils.isEmpty(rs.getString("qzqxmze")) ? "0":rs.getString("qzqxmze"));
            jsonObject.put("mainid",rs.getString("mainid"));
            list.add(jsonObject);
        }
        return list;
    }

    //查询事项表
    public JSONObject getTransactionBYId(String num){
        String sql = "select * from uf_yssxdb where sxbm = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, num);
        JSONObject res = new JSONObject();
        while (rs.next()){
            //事项编码
            res.put("id",rs.getString("id"));
            res.put("sxbm",rs.getString("sxbm"));
            //事项名称
            res.put("sxmc",rs.getString("sxmc"));
            res.put("zdbz",rs.getString("zdbz"));
        }
        return res;
    }

    /**
     *  查询事项年度明细表 根据预算科目
     */

    public ArrayList<JSONObject> getTransactionDt1(String mainid){
        String sql = "select * from uf_yssxdb_dt1 where  mainid = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, mainid);

        ArrayList<JSONObject> jsonObjects = new ArrayList<>();
        while (rs.next()){
            JSONObject res = new JSONObject();
            //全周期事项总额
            res.put("id",rs.getString("id"));
            res.put("ndys",StringUtils.isEmpty(rs.getString("ndys")) ? "0" : rs.getString("ndys"));
            res.put("ysye",StringUtils.isEmpty(rs.getString("ysye")) ? "0" : rs.getString("ysye") );
            res.put("nddzyslx",StringUtils.isEmpty(rs.getString("nddzyslx")) ? "0" : rs.getString("nddzyslx") );
            res.put("nddzysnz",StringUtils.isEmpty(rs.getString("nddzysnz")) ? "0" : rs.getString("nddzysnz") );
            res.put("ndqcys",StringUtils.isEmpty(rs.getString("ndqcys")) ? "0" : rs.getString("ndqcys") );
            res.put("ndyfpxmys",StringUtils.isEmpty(rs.getString("ndyfpxmys")) ? "0" : rs.getString("ndyfpxmys") );
            res.put("zhs",StringUtils.isEmpty(rs.getString("zhs")) ? "0" : rs.getString("zhs") );
            res.put("zys",StringUtils.isEmpty(rs.getString("zys")) ? "0" : rs.getString("zys") );
//            res.put("ndyfpxmys",StringUtils.isEmpty(rs.getString("ndyfpxmys")) ? "0" : rs.getString("ndyfpxmys") );
//            res.put("ysye",rs.getString("ysye"));
            jsonObjects.add(res);
        }
        return jsonObjects;
    }



    /**
     *  查询事项全周期明细表 根据事项id
     */

    public ArrayList<JSONObject> getTransactionDt2(String mainid){
        String sql = "select * from uf_yssxdb_dt2 where mainid = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, mainid);
        ArrayList<JSONObject> jsonObjects = new ArrayList<>();
        while (rs.next()){
            JSONObject res = new JSONObject();
            res.put("id",rs.getString("id"));
            //全周期事项总额
            res.put("qzqsxze", StringUtils.isEmpty(rs.getString("qzqsxze")) ? "0": rs.getString("qzqsxze"));
            //全周期调整额度
            res.put("qzqdzed",StringUtils.isEmpty(rs.getString("qzqdzed")) ? "0": rs.getString("qzqdzed"));
            res.put("qzqylxje",StringUtils.isEmpty(rs.getString("qzqylxje")) ? "0": rs.getString("qzqylxje"));
            res.put("qzqqcze",StringUtils.isEmpty(rs.getString("qzqqcze")) ? "0": rs.getString("qzqqcze"));
            res.put("zhs",StringUtils.isEmpty(rs.getString("zhs")) ? "0": rs.getString("zhs"));
            res.put("zys",StringUtils.isEmpty(rs.getString("zys")) ? "0": rs.getString("zys"));
            jsonObjects.add(res);
        }
        return jsonObjects;
    }

    public ArrayList<JSONObject> getDzyslx(String ysxm){
        String sql = "select *  from uf_yszxdb where ysxm = ?";
        RecordSet rs = new RecordSet();
        rs.executeQuery(sql, ysxm);
        ArrayList<JSONObject> list = new ArrayList<>();
        while (rs.next()){
            JSONObject res = new JSONObject();
            res.put("id", rs.getString("id"));
            res.put("dzyslx", StringUtils.isEmpty(rs.getString("dzyslx")) ? "0":rs.getString("dzyslx"));
            res.put("ndys", StringUtils.isEmpty(rs.getString("ndys")) ? "0":rs.getString("ndys"));
            res.put("dzysnz", StringUtils.isEmpty(rs.getString("dzysnz")) ? "0":rs.getString("dzysnz"));
            res.put("zyys", StringUtils.isEmpty(rs.getString("zyys")) ? "0":rs.getString("zyys"));
            res.put("zhys", StringUtils.isEmpty(rs.getString("zhys")) ? "0":rs.getString("zhys"));
            res.put("fsze", StringUtils.isEmpty(rs.getString("fsze")) ? "0":rs.getString("fsze"));
            list.add(res);
        }
        return list;
    }
}
